home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / GadUtil / Examples / BetterTest-C / BetterTest.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  12KB  |  427 lines

  1. /*------------------------------------------------------------------------**
  2. **              My gadutil.library example translated into C              **
  3. **                                          P-O Yliniemi 24-Dec-94        **
  4. ** Compile with SAS/C 6.x:                                                **
  5. **        sc BetterTest.c                                                 **
  6. **        slink lib:c.o BetterTest.o led.o to BetterTest LIB lib:sc.lib   **
  7. **              lib:amiga.lib SMALLDATA SMALLCODE NODEBUG                 **
  8. **------------------------------------------------------------------------*/
  9. #define INTUI_V36_NAMES_ONLY
  10.  
  11. #include <exec/types.h>
  12. #include <exec/execbase.h>
  13. #include <intuition/intuition.h>
  14. #include <intuition/gadgetclass.h>
  15. #include <libraries/gadtools.h>
  16.  
  17. #include <libraries/gadutil.h>
  18. #include <proto/gadutil.h>
  19. #include <gadutil_20to30comp.h>
  20.  
  21. #include <clib/dos_protos.h>
  22. #include <clib/exec_protos.h>
  23. #include <clib/intuition_protos.h>
  24. #include <clib/gadtools_protos.h>
  25.  
  26. #include <stdio.h>
  27.  
  28. #ifdef LATTICE
  29. int CXBRK(void)     { return(0); }
  30. int chkabort(void)  { return(0); }
  31. #endif
  32.  
  33. extern struct ExecBase *SysBase;
  34.  
  35. #define DRIVE_MX_GAD    11
  36. /*--------------------- Start of localized data --------------------------*/
  37.  
  38. #define MSG_NEXTDRIVE    0
  39. #define MSG_PREVDRIVE    1
  40. #define MSG_DRIVE    2
  41. #define MSG_CHECKME    3
  42. #define MSG_REQUESTER    4
  43. #define MSG_FILENAME    5
  44. #define MSG_INTEGER    6
  45. #define MSG_DRAGME    7
  46. #define MSG_SCROLLME    8
  47. #define MSG_SELECTITEM    9
  48. #define MSG_SELECTCOL    10
  49. #define MNU_1_TITLE    100
  50. #define MNI_1_IT1    101
  51. #define MNI_1_IT2    102
  52. #define MNI_1_IT3    103
  53. #define MNS_1_IT3_1    104
  54. #define MNS_1_IT3_2    105
  55. #define MNI_1_IT4    106
  56.  
  57. static const struct AppString AppStrings[] =
  58. {
  59.     MSG_NEXTDRIVE, (STRPTR)"_Next drive",
  60.     MSG_PREVDRIVE, (STRPTR)"_Prev drive",
  61.     MSG_DRIVE, (STRPTR)"_Drive",
  62.     MSG_CHECKME, (STRPTR)"C_heck me:",
  63.     MSG_REQUESTER, (STRPTR)"_Requester",
  64.     MSG_FILENAME, (STRPTR)"_Filename:",
  65.     MSG_INTEGER, (STRPTR)"_Integer:",
  66.     MSG_DRAGME, (STRPTR)"D_rag me:",
  67.     MSG_SCROLLME, (STRPTR)"Scr_oll me:",
  68.     MSG_SELECTITEM, (STRPTR)"_Select an item:",
  69.     MSG_SELECTCOL, (STRPTR)"Select _Color:",
  70.     MNU_1_TITLE, (STRPTR)" \000Project",
  71.     MNI_1_IT1, (STRPTR)"O\000Open...",
  72.     MNI_1_IT2, (STRPTR)"S\000Save",
  73.     MNI_1_IT3, (STRPTR)" \000Print",
  74.     MNS_1_IT3_1, (STRPTR)" \000Draft",
  75.     MNS_1_IT3_2, (STRPTR)" \000NLQ",
  76.     MNI_1_IT4, (STRPTR)"Q\000Quit",
  77. };
  78.  
  79. #define catalogname "BetterTest.catalog"
  80.  
  81. /*---------------------- End of localized data ---------------------------*/
  82.  
  83. struct TagItem layoutmenutags[] = {
  84.     GTMN_NewLookMenus,    TRUE,
  85.     TAG_DONE
  86. };
  87.  
  88. #define LEFT_OFFSET    6
  89. #define TOP_OFFSET    3
  90.  
  91. struct TagItem StdGTTags[] = {
  92.     GT_Underscore, '_',
  93.     TAG_DONE
  94. };
  95.  
  96. struct TagItem StdButtonTags[] = {
  97.     GU_Flags,    PLACETEXT_IN,    GU_LabelHotkey,    TRUE,    TAG_DONE
  98. };
  99.  
  100. struct TagItem StdGadTags[] = {
  101.     GU_LabelHotkey,    TRUE,    TAG_DONE
  102. };
  103.  
  104. struct TagItem NextDriveGad[] = {
  105.     GU_GadgetKind,    BUTTON_KIND,    GU_LocaleText,    MSG_NEXTDRIVE,
  106.     GU_Left,    LEFT_OFFSET,    GU_Top,        TOP_OFFSET,
  107.     GU_AutoHeight,    4,        GU_AutoWidth,    20,
  108.     TAG_MORE,    (ULONG)StdButtonTags
  109. };
  110.  
  111. struct TagItem PrevDriveGad[] = {
  112.     GU_GadgetKind,    BUTTON_KIND,    GU_LocaleText,    MSG_PREVDRIVE,
  113.     GU_DupeWidth,    MSG_NEXTDRIVE,    GU_LeftRel,    MSG_NEXTDRIVE,
  114.     GU_AddLeft,    INTERWIDTH,    TAG_MORE,    (ULONG)StdButtonTags
  115. };
  116.  
  117. struct TagItem DriveGad[] = {
  118.     GU_GadgetKind,    CYCLE_KIND,    GU_LocaleText,    MSG_DRIVE,
  119.     GU_TopRel,    MSG_PREVDRIVE,    GU_AddTop,        INTERHEIGHT,
  120.     GU_Flags,    PLACETEXT_LEFT,    TAG_MORE,        (ULONG)StdGadTags
  121. };
  122.  
  123. APTR CycleText[] = { "DF0:", "DF1:", "DF2:", "DF3:", NULL };
  124.  
  125. struct TagItem DriveGTTags[] = {
  126.     GTCY_Labels,    (ULONG)CycleText,    TAG_MORE,    (ULONG)StdGTTags
  127. };
  128.  
  129. struct TagItem ReqGad[] = {
  130.     GU_GadgetKind,    BUTTON_KIND,    GU_LocaleText,    MSG_REQUESTER,
  131.     GU_TopRel,    MSG_DRIVE,    GU_AddTop,    INTERHEIGHT,
  132.     TAG_MORE,    (ULONG)StdButtonTags
  133. };
  134.  
  135. struct TagItem CheckBoxGad[] = {
  136.     GU_Width,    CHECKBOX_WIDTH,    GU_Height,    CHECKBOX_HEIGHT,
  137.     GU_GadgetKind,    CHECKBOX_KIND,    GU_LocaleText,    MSG_CHECKME,
  138.     GU_AlignRight,    MSG_NEXTDRIVE,    GU_Flags,    PLACETEXT_LEFT,
  139.     TAG_MORE,    (ULONG)StdGadTags
  140. };
  141.  
  142. struct TagItem FileNameGad[] = {
  143.     GU_GadgetKind,    STRING_KIND,    GU_TopRel,    MSG_REQUESTER,
  144.     GU_LocaleText,    MSG_FILENAME,    GU_AutoHeight,    4,
  145.     GU_AlignLeft,    MSG_CHECKME,    GU_AlignRight,    DRIVE_MX_GAD,
  146.     GU_AddTop,    INTERHEIGHT,    GU_AddWidth,    4,
  147.     TAG_MORE,    (ULONG)StdGadTags
  148. };
  149.  
  150. struct TagItem IntegerGad[] = {
  151.     GU_GadgetKind,    INTEGER_KIND,    GU_TopRel,    MSG_FILENAME,
  152.     GU_LocaleText,    MSG_INTEGER,    GU_AddTop,    INTERHEIGHT,
  153.     TAG_MORE,    (ULONG)StdGadTags
  154. };
  155.  
  156. struct TagItem DriveMxGad[] = {
  157.     GU_GadgetKind,    MX_KIND,    GU_AlignTop,    MSG_NEXTDRIVE,
  158.     GU_Width,    MX_WIDTH,    GU_Height,    MX_HEIGHT,
  159.     GU_AdjustTop,    2,        GU_Flags,    PLACETEXT_LEFT|NG_HIGHLABEL,
  160.     GU_LeftRel,    MSG_PREVDRIVE,    GU_AddLeftChar,    7,
  161.     GU_GadgetText,    (ULONG)"Driv_e",GU_LabelHotkey,    TRUE,
  162.     TAG_DONE
  163. };
  164.  
  165. struct TagItem MXGadGTTags[] = {
  166.     GTMX_Labels,    (ULONG)CycleText,    GTMX_Spacing,    2,
  167.     GTMX_Active,    2,            TAG_DONE
  168. };
  169.  
  170. struct TagItem SliderGad[] = {
  171.     GU_GadgetKind,    SLIDER_KIND,    GU_AlignLeft,    MSG_FILENAME,
  172.     GU_AlignRight,    MSG_FILENAME,    GU_AutoHeight,    4,
  173.     GU_TopRel,    MSG_INTEGER,    GU_AddTop,    INTERHEIGHT,
  174.     GU_AddWidth,    -13,        GU_Flags,    PLACETEXT_LEFT,
  175.     GU_LocaleText,    MSG_DRAGME,    TAG_MORE,    (ULONG)StdGadTags
  176. };
  177.  
  178. struct TagItem SliderGTTags[] = {
  179.     GTSL_Min,        -50,            GTSL_Max,    50,
  180.     GTSL_Level,        10,            GTSL_MaxLevelLen, 3,
  181.     GTSL_LevelFormat,    (ULONG)"%3ld",
  182.     GTSL_LevelPlace,    PLACETEXT_RIGHT,
  183.     TAG_MORE,        (ULONG)StdGTTags
  184. };
  185.  
  186. struct TagItem ListViewGad[] = {
  187.     GU_GadgetKind,    LISTVIEW_KIND,    GU_AlignTop,    MSG_DRIVE,
  188.     GU_AlignBottom,    MSG_INTEGER,    GU_LocaleText,    MSG_SELECTITEM,
  189.     GU_LeftRel,    MSG_INTEGER,    GU_Columns,    26,
  190.     GU_Flags,    PLACETEXT_ABOVE|NG_HIGHLABEL,
  191.     GU_AddLeft,    10,        TAG_MORE,    (ULONG)StdGadTags
  192. };
  193.  
  194. struct TagItem LVGTTags[] = {
  195.     GTLV_Labels,    NULL,        GTLV_ShowSelected,    -1L,
  196.     TAG_MORE,    (ULONG)StdGTTags
  197. };
  198.  
  199. struct TagItem ScrollGad[] = {
  200.     GU_GadgetKind,    SCROLLER_KIND,    GU_LocaleText,    MSG_SCROLLME,
  201.     GU_AlignLeft,    MSG_DRAGME,    GU_AlignRight,    MSG_INTEGER,
  202.     GU_TopRel,    MSG_DRAGME,    GU_AddTop,    INTERHEIGHT,
  203.     GU_Flags,    PLACETEXT_LEFT,    GU_AddWidth,    20,
  204.     GU_DupeHeight,    MSG_DRAGME,    TAG_MORE,    (ULONG)StdGadTags
  205. };
  206.  
  207. struct TagItem ScrollGTTags[] = {
  208.     GTSC_Top,    110,        GTSC_Total,    9,
  209.     GTSC_Visible,    5,        GTSC_Arrows,    16,
  210.     TAG_MORE,    (ULONG)StdGTTags
  211. };
  212.  
  213. struct TagItem PaletteGad[] = {
  214.     GU_GadgetKind,    PALETTE_KIND,    GU_LocaleText,    MSG_SELECTCOL,
  215.     GU_LeftRel,    MSG_SCROLLME,    GU_AddLeft,    INTERWIDTH,
  216.     GU_Flags,    PLACETEXT_ABOVE|NG_HIGHLABEL,
  217.     GU_TopRel,    MSG_SELECTITEM,    GU_AdjustTop,    INTERHEIGHT,
  218.     GU_AlignBottom,    MSG_SCROLLME,    GU_AlignRight,    MSG_SELECTITEM,
  219.     TAG_MORE,    (ULONG)StdGadTags
  220. };
  221.  
  222. struct TagItem PaletteGTTags[] = {
  223.     GTPA_Depth,    2,        GTPA_IndicatorWidth,    36,
  224.     TAG_MORE,    (ULONG)StdGTTags
  225. };
  226.  
  227. struct LayoutGadget gadgets[] = {
  228.     MSG_NEXTDRIVE,    NextDriveGad,    StdGTTags,    NULL,
  229.     MSG_PREVDRIVE,    PrevDriveGad,    StdGTTags,    NULL,
  230.     MSG_DRIVE,    DriveGad,    DriveGTTags,    NULL,
  231.     MSG_REQUESTER,    ReqGad,        StdGTTags,    NULL,
  232.     MSG_CHECKME,    CheckBoxGad,    StdGTTags,    NULL,
  233.     MSG_FILENAME,    FileNameGad,    StdGTTags,    NULL,
  234.     MSG_INTEGER,    IntegerGad,    StdGTTags,    NULL,
  235.     DRIVE_MX_GAD,    DriveMxGad,    MXGadGTTags,    NULL,
  236.     MSG_DRAGME,    SliderGad,    SliderGTTags,    NULL,
  237.     MSG_SELECTITEM,    ListViewGad,    LVGTTags,    NULL,
  238.     MSG_SCROLLME,    ScrollGad,    ScrollGTTags,    NULL,
  239.     MSG_SELECTCOL,    PaletteGad,    PaletteGTTags,    NULL,
  240.     -1,        NULL,        NULL,        NULL
  241. };
  242.  
  243. struct NewMenu MyNewMenu[] = {
  244.      NM_TITLE,    (STRPTR)MNU_1_TITLE,    0,    0,    0,    0,            /* | Project |    */
  245.       NM_ITEM,    (STRPTR)MNI_1_IT1,        0,    0,    0,    (APTR)1,    /* Open [O]        */
  246.       NM_ITEM,    (STRPTR)MNI_1_IT2,        0,    0,    0,    (APTR)2,    /* Save [S]        */
  247.       NM_ITEM,    NM_BARLABEL,            0,    0,    0,    0,            /* -----------    */
  248.       NM_ITEM,    (STRPTR)MNI_1_IT3,        0,    0,    0,    0,            /* Print...        */
  249.        NM_SUB,    (STRPTR)MNS_1_IT3_1,    0,    0,    0,    (APTR)3,    /*      Draft    */
  250.        NM_SUB,    (STRPTR)MNS_1_IT3_2,    0,    0,    0,    (APTR)4,    /*      NLQ        */
  251.       NM_ITEM,    NM_BARLABEL,            0,    0,    0,    0,            /* -----------    */
  252.       NM_ITEM,    (STRPTR)MNI_1_IT4,        0,    0,    0,    (APTR)5,    /* Quit [Q]        */
  253.      NM_END,    NULL,                    0,    0,    0,    0
  254. };
  255.  
  256. LONG farright, farbottom;
  257.  
  258. struct TagItem LayoutTags[] = {
  259.     GU_RightExtreme,    (ULONG)&farright,
  260.     GU_LowerExtreme,    (ULONG)&farbottom,
  261.     GU_DefTextAttr,        0,
  262.     GU_Catalog,        0,
  263.     GU_AppStrings,        (ULONG)&AppStrings,
  264.     TAG_DONE
  265. };
  266.  
  267. /*-----------------------------------------------------------------*/
  268. struct Library *GadUtilBase;
  269.  
  270. struct List      LibraryList;
  271. struct Screen *screen = NULL;
  272. struct Window *main_win = NULL;
  273. APTR priv_info = NULL;
  274.  
  275. void process_window_events(struct Window *, struct Menu *);
  276. void ToggleLED(void);
  277.  
  278. main()
  279. {
  280.     struct Gadget *glist;
  281.     struct Menu *menustrip;
  282.     LibraryList = SysBase->LibList;
  283.  
  284.     LVGTTags[0].ti_Data = (ULONG)&LibraryList;
  285.  
  286.     if (GadUtilBase = OpenLibrary("gadutil.library",0))
  287.     {
  288.         LayoutTags[3].ti_Data = (ULONG)GU_OpenCatalog(catalogname,0);
  289.  
  290.         if (screen = LockPubScreen(NULL))
  291.         {
  292.             LayoutTags[2].ti_Data = (ULONG)screen->Font;
  293.  
  294.             if (priv_info = GU_LayoutGadgetsA(&glist, gadgets, screen, LayoutTags))
  295.             {
  296.                 if (main_win = OpenWindowTags(NULL,
  297.                             WA_Left,    0,
  298.                             WA_Top,        screen->Font->ta_YSize + 3,
  299.                             WA_InnerWidth, farright + LEFT_OFFSET,
  300.                             WA_InnerHeight, farbottom + TOP_OFFSET,
  301.                             WA_IDCMP,    LISTVIEWIDCMP | IDCMP_MENUPICK | CYCLEIDCMP |
  302.                                     IDCMP_REFRESHWINDOW | IDCMP_CLOSEWINDOW |
  303.                                     IDCMP_VANILLAKEY | IDCMP_RAWKEY,
  304.                             WA_Flags,    WFLG_DRAGBAR | WFLG_DEPTHGADGET |
  305.                                     WFLG_CLOSEGADGET | WFLG_ACTIVATE |
  306.                                     WFLG_SMART_REFRESH | WFLG_REPORTMOUSE,
  307.                             WA_Gadgets, glist,    WA_NewLookMenus,    TRUE,
  308.                             WA_Title,    "GadUtil library test",
  309.                             TAG_DONE))
  310.                 {
  311.                     GU_RefreshWindow(main_win, NULL);
  312.                     if (menustrip = GU_CreateLocMenuA(MyNewMenu, priv_info,
  313.                             NULL, layoutmenutags))
  314.                     {
  315.                         if (SetMenuStrip(main_win, menustrip))
  316.                         {
  317.                             process_window_events(main_win, menustrip);
  318.                             ClearMenuStrip(main_win);
  319.                         }
  320.                         GU_FreeMenus(menustrip);
  321.                     }
  322.                     CloseWindow(main_win);
  323.                 }
  324.                 GU_FreeLayoutGadgets(priv_info);
  325.             }
  326.             UnlockPubScreen(NULL, screen);
  327.         }
  328.         GU_CloseCatalog((struct Catalog *)LayoutTags[3].ti_Data);
  329.         CloseLibrary((struct Library *)GadUtilBase);
  330.     }
  331. }
  332.  
  333. void process_window_events(struct Window *win, struct Menu *menuStrip)
  334. {
  335.     struct IntuiMessage *imsg;
  336.     struct Gadget *gad, *tempgad;
  337.     struct MenuItem *item;
  338.     BOOL done = FALSE;
  339.     UWORD menunumber;
  340.     ULONG coords;
  341.  
  342.     while (!done)
  343.     {
  344.         Wait(1 << win->UserPort->mp_SigBit);
  345.  
  346.         while ((!done) && (imsg = GU_GetIMsg(win->UserPort)))
  347.         {
  348.             switch (imsg->Class)
  349.             {
  350.                 case IDCMP_GADGETUP:
  351.                     ToggleLED();
  352.                     gad = (struct Gadget *)imsg->IAddress;
  353.                     switch (gad->GadgetID)
  354.                     {
  355.                         case MSG_NEXTDRIVE:
  356.                             if (tempgad = GU_GetGadgetPtr(DRIVE_MX_GAD, gadgets) )
  357.                             {
  358.                                 if ((LONG)MXGadGTTags[2].ti_Data++ >= 3) MXGadGTTags[2].ti_Data = 0;
  359.                                 GU_SetGadgetAttrsA(tempgad, win, NULL, &MXGadGTTags[2]);
  360.                             }
  361.                             break;
  362.  
  363.                         case MSG_PREVDRIVE:
  364.                             if (tempgad = GU_GetGadgetPtr(DRIVE_MX_GAD, gadgets) )
  365.                             {
  366.                                 if ((LONG)MXGadGTTags[2].ti_Data-- <= 0) MXGadGTTags[2].ti_Data = 3;
  367.                                 GU_SetGadgetAttrsA(tempgad, win, NULL, &MXGadGTTags[2]);
  368.                             }
  369.                             break;
  370.  
  371.                         case MSG_REQUESTER:
  372.                             GU_BlockInput(win);
  373.                             Delay(50);
  374.                             GU_FreeInput(win);
  375.                             break;
  376.  
  377.                         case MSG_DRIVE:
  378.                             ToggleLED();
  379.                             break;
  380.                     }
  381.  
  382.                 case IDCMP_GADGETDOWN:
  383.                     gad = (struct Gadget *)imsg->IAddress;
  384.                     if (gad->GadgetID == DRIVE_MX_GAD)
  385.                         MXGadGTTags[2].ti_Data = imsg->Code;
  386.                     break;
  387.  
  388.                 case IDCMP_MOUSEMOVE:
  389.                     if (tempgad = GU_GetGadgetPtr(MSG_SELECTITEM, gadgets))
  390.                     {
  391.                         coords = (LONG)imsg->MouseX<<16|imsg->MouseY;
  392.  
  393.                         if (GU_CoordsInGadBox(coords,tempgad))
  394.                         {
  395.                             ToggleLED();
  396.                         }
  397.                     }
  398.                     break;
  399.  
  400.                 case IDCMP_MENUPICK:
  401.                     menunumber = imsg->Code;
  402.  
  403.                     while ((menunumber != MENUNULL) && (!done))
  404.                     {
  405.                         item = ItemAddress(menuStrip, menunumber);
  406.  
  407.                         if ( (LONG)GTMENUITEM_USERDATA(item) == 5)
  408.                             done = TRUE;
  409.  
  410.                         menunumber = item->NextSelect;
  411.                     }
  412.                     break;
  413.  
  414.                 case IDCMP_CLOSEWINDOW:
  415.                     done = TRUE;
  416.                     break;
  417.  
  418.                 case IDCMP_REFRESHWINDOW:
  419.                     GU_BeginRefresh(win);
  420.                     GU_EndRefresh(win, TRUE);
  421.                     break;
  422.             }
  423.             GU_ReplyIMsg(imsg);
  424.         }
  425.     }
  426. }
  427.